package com.zw.utils;

import java.util.function.BinaryOperator;

/**
 * Reduce操作工具类
 * 根据类型提供合适的reduce函数
 */
public class ReduceOperationUtil {

    /**
     * 根据类型获取对应的reduce操作函数
     *
     * @param type 数据类型 (bigint, int, float, double)
     * @return 对应的BinaryOperator
     * @throws IllegalArgumentException 如果类型不支持
     */
    @SuppressWarnings("unchecked")
    public static <T> BinaryOperator<T> getReduceOperator(String type) {
        return switch (type) {
            case "int" -> (BinaryOperator<T>) getIntegerReduceOperator();
            case "bigint" -> (BinaryOperator<T>) getLongReduceOperator();
            case "float" -> (BinaryOperator<T>) getFloatReduceOperator();
            case "double" -> (BinaryOperator<T>) getDoubleReduceOperator();
            default -> throw new IllegalArgumentException("不支持的reduce操作类型: " + type);
        };
    }

    /**
     * 获取Integer类型的reduce操作函数 (求和)
     */
    public static BinaryOperator<Integer> getIntegerReduceOperator() {
        return (a, b) -> {
            if (a == null) return b;
            if (b == null) return a;
            return a + b;
        };
    }

    /**
     * 获取Long类型的reduce操作函数 (求和)
     */
    public static BinaryOperator<Long> getLongReduceOperator() {
        return (a, b) -> {
            if (a == null) return b;
            if (b == null) return a;
            return a + b;
        };
    }

    /**
     * 获取Float类型的reduce操作函数 (求和)
     */
    public static BinaryOperator<Float> getFloatReduceOperator() {
        return (a, b) -> {
            if (a == null) return b;
            if (b == null) return a;
            return a + b;
        };
    }

    /**
     * 获取Double类型的reduce操作函数 (求和)
     */
    public static BinaryOperator<Double> getDoubleReduceOperator() {
        return (a, b) -> {
            if (a == null) return b;
            if (b == null) return a;
            return a + b;
        };
    }

    /**
     * 获取Integer类型的平均值reduce操作函数
     * 注意: 这个方法需要结合其他操作使用，不能单独作为reduce函数
     */
    public static BinaryOperator<Integer> getIntegerAvgCollector() {
        return Integer::sum;
    }

    /**
     * 获取Long类型的平均值reduce操作函数
     * 注意: 这个方法需要结合其他操作使用，不能单独作为reduce函数
     */
    public static BinaryOperator<Long> getLongAvgCollector() {
        return Long::sum;
    }

    /**
     * 获取Float类型的平均值reduce操作函数
     * 注意: 这个方法需要结合其他操作使用，不能单独作为reduce函数
     */
    public static BinaryOperator<Float> getFloatAvgCollector() {
        return Float::sum;
    }

    /**
     * 获取Double类型的平均值reduce操作函数
     * 注意: 这个方法需要结合其他操作使用，不能单独作为reduce函数
     */
    public static BinaryOperator<Double> getDoubleAvgCollector() {
        return Double::sum;
    }
}